var initObjJieGou = (function(){
    // let { a } = {a: 1};
    // console.log(a);

    // let a1 = [1, 2, 3], obj2 = {};
    // [obj2.a, obj2.b, obj2.c] = a1;
    // console.log(obj2);

    // 声明，加括号就报错
    // let [(a)] = [1];
    // let ({a: b}) = {};
    // let {(a): b} = {};
    // let {a: (b)} = {};

    // 函数声明加括号，报错
    // function foo([(a)]){}

    // [(b)] = [3]
    // ([b]) = [3] // 模式不同 左：表达式 右：数组
    // ({a: (b) = {}}) // {}
    // [(a.b)] = [3]

    // 变量a,b交换
    let a = 10, b = 20;
    [a, b] = [b, a];
    console.log(a, b);

    // 模式匹配可以匹配同源属性
    let {a: x, a: y} = {a: 1};
    console.log(x, y);
});

var initJieGou = (function(){
    // 练习: 考点 默认值
    var x = 200, y = 300, z = 100;
    var obj1 = {x: {y: 42},z: {y: z}};
    ({y: x = {y: y}} = obj1);
    ({z: y = {y: z}} = obj1);
    ({x: z = {y: x}} = obj1);

    console.log(x.y, y.y, z.y);

});

var initFnJieGou = (function(){
    function foo({x = 10} = {}, {y} = {y: 10}){
        console.log(x, y);
    }

    // foo();
    // foo({}, {});
    foo({x: 2}, {y: 3});
});

var initYinShi = (function(){
    // 解构隐式转换
    const [a, b, c, d, e] = 'hello'; // 转类数组
    console.log(a, b, c, d, e);

    // string\number\boolean 可以转换
    
    // undefined&null不能隐式转换
});

var initParam = function(){
    initObjJieGou();
    initJieGou();
    initFnJieGou();
    initYinShi();
}

initParam();